検証環境のFargateのタスクを定期停止・定期起動してみた #Fargate
コカコーラ大好き、カジです。
お客様よりFargateを検証環境で複数構築していて、夜間停止したいとご要望をもらいました。 その方法について調査しましたので、ご紹介します。
参考元
以下のブログが大変参考になりました。ありがとうございました。
【小ネタ】FargateのAutoScallingをスケジュールベースで動かす方法 - Qiita
上記ブログでは、1つのFargateのECSクラスタ、サービスの停止起動ですが、私の方で、複数Fargateに対応できるようLambdaを修正しました。 (私は、Python素人なので、社内のPython詳しいメンバーにも助けてもらいました。感謝)
構築するもの
以下の3つでできます。
- ECSのタスク起動数を変更するLambda
- 上記Lambda実行用のIAM Role
- 上記Lambdaを実行する(キックする)CloudWatch Events
前提条件
Fargateのタスクスケジューリングを行いたい場合は、こちらで構築できます。
Fargateの環境が、以下の2つあるとします。それぞれタスク数は1にしています。
そのタスク数を0にして停止します。ALBは停止(削除)しません。
以前のこちらのブログのCloudFormationを利用して、Fargateを複数構築しています。
sample-fargate-cluster、sample-fargate-service sample-fargate2-cluster、sample-fargate2-service
ECSのタスク起動数を変更するLambdaの構築
初心者向けに、細かく説明しています。 Lambdaを知っている人は、コードと、Lambda用のIAM Role部分があれば十分だと思いますので、読み飛ばしてください。
では、Lamdbaのコンソールから構築します。関数名、Pythonを選び、実行ロールは新規作成します。
ECSのタスク起動数を変更するLambdaのFunctionコード
For文のFargateのクラスタ名、サービス名を適時書き換えて利用してください。
import boto3 from botocore.exceptions import ClientError def lambda_handler(event, context): try: client = boto3.client('ecs') for cluster_name, service_name in [('sample-fargate-cluster', 'sample-fargate-service'), ('sample-fargate2-cluster', 'sample-fargate2-service')]: service_update_result = client.update_service( cluster = cluster_name, service = service_name, desiredCount = 0 # ここの数を増減させる ) print(service_update_result) except ClientError as e: print("exceptin: %s" % e)
ECSのタスク起動数を変更するLambda実行用のIAM Role修正
自動作成された、IAMロールを表示して、ECSを許可する設定を追加修正します。
ポリシーの編集をクリックします。
Lambda実行用のIAM Role
IAM Roleを修正します。
デフォルトで作成されるIAM RoleにECS許可部分を追加します。(削除して以下をコピーアンドペーストで上書きでOK)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeServices", "ecs:UpdateService" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }
反映されていることを確認します。
テスト実行
Fargateのタスク数が0になり、停止になるのでご注意ください。
テストを押して、テスト名を設定して保存します。
テストをクリックして実行します。正常に実行できると、このように表示されます。
詳細を確認するには、CloudWatch Logsのログも確認しましょう。
Fargateのタスク数が0になっていることをECSのコンソールで確認します。
LambdaのコードのdesiredCountを書き換えて保存し、再度実行するとその台数に戻ります。
定期実行するCloudwatch Eventsの作成
Lambdaのコンソールで、今回作成したLambda(fargate-stop)で、トリガー追加クリック
Cloudwatch Eventsを選んで、ルール名を設定しCron形式に実行したい時間を入力します。
あとは、実行時間に正常動作するか確認します。
最後に、もう一つ起動用のLambdaを作成
同様の手順で、起動用のLambdaを作成してください。
以上、どなたかのお役に立てれば光栄です。